/* Copyright (C) 2008  Romolo Camplani, Marco Fortunato, Marco Marelli, Guido Rota, Fabio A. Schreiber et al.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
package org.dei.perla.parser.util;

import java.util.ArrayList;
import java.util.Collection;

import org.dei.perla.utils.logger.ILogger;
import org.dei.perla.utils.logger.LogRecord;
import org.dei.perla.utils.logger.LogRecord.Type;
import org.dei.perla.utils.logger.LogRecord.Verbosity;

/**
 * Classe logger comune per i vari componenti del parser
 */
public class ParserLogger {

	private final static String SOURCETYPE = "Parser";
	
	/**
	 * Istanza attuale del logger
	 */
	private static ParserLogger parserLogger = null;
	
	/**
	 * Lista dei loggers registrati
	 */
	private ArrayList<ILogger> loggers = null;
	
	/**
	 * Istanzia un nuovo oggetto.
	 * Privato in quanto puo' essere richiamato solamente 
	 * all'interno di questa classe
	 */
	private ParserLogger() {
		
		loggers = new ArrayList<ILogger>();
	}
	
	/**
	 * Libera l'istanza nel caso l'oggetto venga distrutto
	 */
	public void finalize() {
		
		parserLogger = null;
	}
	
	/**
	 * Restituisce l'istanza di ParserLogger comune
	 * @return istanza di ParserLogger
	 */
	static public ParserLogger getInstance() {
		
		if (parserLogger == null) {
			
			parserLogger = new ParserLogger();
		}
		
		return parserLogger;
	}
	
	/**
	 * Aggiunge un logger
	 * 
	 * @param logger da aggiungere
	 */
	public void attachLogger(ILogger logger) {
		
		if (!loggers.contains(logger)) {
			
			loggers.add(logger);
		}
	}
	
	/**
	 * Aggiunge i logger contenuti nella Collection alla lista di logger utilizzati
	 * dal componente
	 * 
	 * @param loggers Collection di logger da aggiungere
	 */
	public void attachLogger(Collection<ILogger> loggers) {
		
		loggers.addAll(loggers);
	}
	
	/**
	 * Rimuove un logger
	 * 
	 * @param logger logger da rimuovere
	 */
	public void removeLogger(ILogger logger) {
		
		if (loggers.contains(logger)) {
			
			loggers.remove(logger);
		}
	}
	
	/**
	 * Aggiunge un record nei vari logger
	 * 
	 * @param messageType tipo del messaggio
	 * @param verbosity verbosita' del messaggio
	 * @param sourceName classe e metodo che hanno generato l'errore
	 * @param message messaggio di errore
	 * @param details dettagli aggiuntivi del messaggio di errore
	 */
	public void printMessage(Type messageType, Verbosity verbosity, String sourceName, String message, String details) {
		
		// Creazione del record da inserire nei log
		LogRecord logRecord = new LogRecord(SOURCETYPE, sourceName, messageType, message, details, verbosity);
		
		// Inserimento del record nei vari logger
		for (ILogger logger : loggers) {
			
			logger.add(logRecord);
		}
	}
}
